package controller

import (
	"github.com/gin-gonic/gin"
	"golang.org/x/crypto/bcrypt"
	"regexp"
	"strings"
	"user/dao"
	"user/model"
	"user/utils"
)

func Test(c *gin.Context) {
	panic("this is test")
}

func Register(c *gin.Context) {
	var user model.User
	if err := c.ShouldBind(&user); err != nil {
		panic(err)
	}
	user.UserName = strings.TrimSpace(user.UserName)
	user.Telephone = strings.TrimSpace(user.Telephone)
	user.Password = strings.TrimSpace(user.Password)

	if m, _ := regexp.MatchString(`^(1[3|4|5|8][0-9]\d{8})$`, user.Telephone); !m {
		utils.Fail(c, "电话号码格式不正确")
		return
	}
	if m, _ := regexp.MatchString(`^\w{6,20}$`, user.Password); !m {
		utils.Fail(c, "密码必须为6~20的数字字母")
		return
	}
	if len(user.UserName) == 0 {
		//随机生成
		user.UserName = utils.RandChar(10)
	} else {
		if m, _ := regexp.MatchString(`^\w{3,}$`, user.UserName); !m {
			utils.Fail(c, "用户名格式不正确")
			return
		}
	}

	password, err := bcrypt.GenerateFromPassword([]byte(user.Password), bcrypt.DefaultCost)
	if err != nil {
		utils.Fail(c, "密码加密出错")
		return
	}
	user.Password = string(password)
	//判断数据库中电话号码是否存在
	u := dao.GetUserByTelephone(user.Telephone)
	if u.ID != 0 {
		utils.Fail(c, "该手机已注册")
		return
	}
	//数据入库
	id := dao.AddUser(user)
	if id > 0 {
		utils.Success(c, "注册成功", gin.H{"id": id})
	} else {
		utils.Fail(c, "注册失败")
	}
}

func Login(c *gin.Context) {
	telephone := c.PostForm("telephone")
	password := c.PostForm("password")

	telephone = strings.TrimSpace(telephone)
	password = strings.TrimSpace(password)
	if utils.CheckTelephone(telephone) == false {
		utils.Fail(c, "电话号码格式不正确")
		return
	}
	if m, _ := regexp.MatchString(`^\w{6,20}$`, password); !m {
		utils.Fail(c, "密码必须为6~20的数字字母")
		return
	}

	user := dao.GetUserByTelephone(telephone)
	if user.ID == 0 {
		utils.Fail(c, "用户未找到")
		return
	}
	if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password)); err != nil {
		utils.Fail(c, "密码不正确")
		return
	}
	utils.Success(c, "登录成功", gin.H{"id": user.ID})
}
